int *path;
int **result;
int pathTop;
int resultTop;
int sum = 0;

void backtracking(int n, int k, int startIndex) {
    if (pathTop == k) {
        if (sum == n) {
            int *temp = (int *)malloc(sizeof(int) * k);
            for(int i = 0; i < k; i++) {
                temp[i] = path[i];
            }
            result[resultTop++] = temp;
        }
        return;  // 1# 注意 return 是在 pathTop == k 就执行
    }

    for(int i = startIndex; i <= 9; i++) { // 2# 注意 i = startIndex
        path[pathTop++] = i; // 3# 注意 pathTop要++
        sum += path[pathTop-1]; // 4# 注意 pathTop - 1 才是path现在的末尾元素
        backtracking(n, k, i + 1);
        sum -= path[--pathTop]; // 5# 注意 --pathTop 才是 path 现在的末尾元素
    }

}

int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes) {
    path = (int *)malloc(sizeof(int) * k);
    result = (int **)malloc(sizeof(int *) * 10000); // 6# 注意这里是 sizeof(int *)
    pathTop = resultTop = 0;

    backtracking(n, k, 1);

    *returnSize = resultTop;

    *returnColumnSizes = (int *)malloc(sizeof(int) * resultTop); // 7# 注意这里是 sizeof(int)
    for(int i = 0; i < resultTop; i++) {
        (*returnColumnSizes)[i] = k;
    }

    return result;
}